package com.nlelpct.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;

import java.nio.charset.StandardCharsets;

/**
 * @author :小马
 * @date : 2023-07-13
 */
public class Sm4Utils {

    private SM4 sm4;

    private Sm4Utils() {
    }

    /**
     * 初始化sm4加密对象，可将其手动丢到Spring容器中使用
     *
     * @param key 加密的key, 长度128位, 在Java中一个字符占8位(utf-8) 所以长度为16个字符
     * @param iv  偏移向量，加盐
     */
    public Sm4Utils(String key, String iv) {
        sm4 = new SM4(Mode.CBC, Padding.ZeroPadding, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 初始化sm4加密对象，可将其手动丢到Spring容器中使用
     *
     * @param key 加密的key, 长度128位, 在Java中一个字符占8位(utf-8) 所以长度为16个字符
     */
    public Sm4Utils(String key) {
        sm4 = new SM4(Mode.CBC, Padding.ZeroPadding, key.getBytes(StandardCharsets.UTF_8), key.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 加密
     *
     * @param plainTxt 需要加密的明文
     * @return 加密后的密文
     */
    public String encrypt(String plainTxt) {
        byte[] encrypt = sm4.encrypt(plainTxt);
        return Base64.encode(encrypt);
    }

    /**
     * 解密
     *
     * @param data 加密后的密文
     * @return 明文
     */
    public String decrypt(String data) {
        byte[] decode = Base64.decode(data);
        return sm4.decryptStr(decode, CharsetUtil.CHARSET_UTF_8);
    }
}
